﻿using System.Web.Mvc;
using zeus.Core;
using SharpArch.Web.NHibernate;
using SharpArch.Core;
using SharpArch.Core.PersistenceSupport;
using System.Collections.Generic;
using Webdiyer.WebControls.Mvc;
using System;
using System.Linq;
using zeus.Core.RepositoryInterfaces;
using zeus.Web.Controllers.Helpers;
using System.Web;

namespace zeus.Web.Controllers
{
    [HandleError]
    public class PerfilController : Controller
    {

        #region Constructor
        private readonly IRepository<Cliente> clienteRepository;
        private readonly IRepository<Idioma> idiomaRepository;
        private readonly IRepository<Pais> paisRepository;
        private readonly IUsuarioRepository usuarioRepository;

        public PerfilController(IRepository<Cliente> clienteRepository,
            IRepository<Idioma> idiomaRepository,
            IRepository<Pais> paisRepository,
            IUsuarioRepository usuarioRepository)
        {
            Check.Require(usuarioRepository != null, "usuarioRepository may not be null");
            this.usuarioRepository = usuarioRepository;

            Check.Require(clienteRepository != null, "clienteRepository may not be null");
            this.clienteRepository = clienteRepository;

            Check.Require(idiomaRepository != null, "idiomaRepository may not be null");
            this.idiomaRepository = idiomaRepository;

            Check.Require(paisRepository != null, "paisRepository may not be null");
            this.paisRepository = paisRepository;
        }

        public WorkingSession workingSession
        {
            get
            {
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();
                return Session["WorkingSession"] as WorkingSession;
            }
            set
            {
                Session["WorkingSession"] = value;
            }
        }
        #endregion

        /// <summary>
        /// Lista todos los clientes
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Transaction, Authorize]
        public ActionResult Perfil(int? id)
        {
            try
            {
                // Determinar si tiene autorización
                if (!usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                    return RedirectToAction("NoAutorizado", "Shared");

                PagedList<Cliente> clientes = new PagedList<Cliente>(clienteRepository.GetAll(), id ?? 1, 10);
                return View(clientes);
            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }

        }
        
        /// <summary>
        /// Metodo GET para nuevo cliente.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Transaction, Authorize]
        public ActionResult NuevoCliente(int? id)
        {
            try
            {
                // Determinar si tiene autorización
                if (!usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                    return RedirectToAction("NoAutorizado", "Shared");

                Cliente cliente = new Cliente();
                if (id != null)
                {
                    cliente = clienteRepository.Get(id.Value);
                }

                InicializarCombosCliente(cliente);

                return View(cliente);
            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
        }

        /// <summary>
        /// Metodo POST para crear o editar un cliente
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="cliente"></param>
        /// <param name="file"></param>
        /// <returns></returns>
        [Transaction, HttpPost, Authorize]
        public ActionResult NuevoCliente(int? Id, Cliente cliente, HttpPostedFileBase file)
        {
            try
            {
                // Determinar si tiene autorización
                if (!usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                    return RedirectToAction("NoAutorizado", "Shared");

                if (ModelState.IsValid && cliente.IsValid())
                {
                    Cliente clienteUpdate = cliente;

                    if (Id != null)
                    {
                        clienteUpdate = clienteRepository.Get(Id.Value);
                        UpdateModel(clienteUpdate);
                    }

                    clienteRepository.SaveOrUpdate(clienteUpdate);

                    return RedirectToAction("Perfil");
                }

                //if (file.ContentLength > 0)
                //{
                //    var fileName = Path.GetFileName(file.FileName);
                //    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                //    file.SaveAs(path);
                //}
                               
                InicializarCombosCliente(cliente);
                return View(cliente);
            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
        }

        /// <summary>
        /// Eliminar un cliente. Llamada AJAX
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Transaction, HttpPost, Authorize]
        public ActionResult DeleteCliente(int id)
        {
            try
            {
                // Determinar si tiene autorización
                if (!usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                    return RedirectToAction("NoAutorizado", "Shared");

                Cliente cliente = clienteRepository.Get(id);
                clienteRepository.Delete(cliente);
                clienteRepository.DbContext.CommitTransaction();
                return Json("");
            }
            catch (PreconditionException)
            {
                return Json("Ha ocurrido un error en la aplicación. Por favor intente más tarde.");
            }
            catch (Exception)
            {
                return Json("El registro no pudo ser eliminado, posiblemente tenga relación con otra entidad.");
            }
        }

        /// <summary>
        /// Inicializar combos para cliente
        /// </summary>
        /// <param name="cliente"></param>
        private void InicializarCombosCliente(Cliente cliente)
        {
            List<SelectListItem> tipoDocumento = new List<SelectListItem>() 
                { 
                    new SelectListItem { Text = "Cédula", Value = "C" },
                    new SelectListItem { Text = "RUC", Value = "R" },
                    new SelectListItem { Text = "Otro", Value = "O" },
                };

            ViewData["TipoDocumento"] = new SelectList(tipoDocumento, "Value", "Text", cliente.TipoDocumento);

            IList<Idioma> idiomas = idiomaRepository.GetAll();
            ViewData["CodigoIdioma"] = new SelectList(idiomas, "Id", "Nombre", cliente.CodigoIdioma);

            IList<Pais> paises = paisRepository.GetAll();
            ViewData["CodigoPais"] = new SelectList(paises, "Id", "Nombre", cliente.CodigoPais);
                        
        }
        
    }
}
